/**
 * @file    types.h
 * @brief   Standard type definitions for embedded systems
 * @version 1.1.0
 * @date    2023-08-15
 * 
 * @license MIT
 */

#ifndef PROJECT_TYPES_H
#define PROJECT_TYPES_H

#ifdef __cplusplus
extern "C" {
#endif

/*------------------------- 编译器兼容性处理 -------------------------*/
#if defined(__GNUC__) || defined(__clang__)
  #define PACKED_STRUCT __attribute__((packed))
  #define WEAK_SYMBOL   __attribute__((weak))
#elif defined(_MSC_VER)
  #define PACKED_STRUCT __pragma(pack(push, 1))
  #define WEAK_SYMBOL   __declspec(selectany)
#else
  #define PACKED_STRUCT
  #define WEAK_SYMBOL
  #pragma message("Unknown compiler - using default packing")
#endif

/*------------------------- 标准头文件包含 -------------------------*/
#include <stdint.h>     // 标准整数类型
#include <stdbool.h>    // 布尔类型
#include <stddef.h>     // size_t, NULL
#include <stdio.h>
#include <stdarg.h>
/*------------------------- 平台检测 -------------------------*/
#if defined(__ARM_ARCH)
  #define PLATFORM_ARM
#elif defined(__AVR__)
  #define PLATFORM_AVR
#elif defined(__x86_64__) || defined(_M_X64)
  #define PLATFORM_X86_64
#elif defined(__i386__) || defined(_M_IX86)
  #define PLATFORM_X86
#else
  #define PLATFORM_UNKNOWN
#endif

/*======================= 核心类型定义 =======================*/

/**
 * @brief 无符号固定宽度整数类型
 */
typedef uint8_t   u8;
typedef uint16_t  u16;
typedef uint32_t  u32;
typedef uint64_t  u64;

/**
 * @brief 有符号固定宽度整数类型
 */
typedef int8_t    s8;
typedef int16_t   s16;
typedef int32_t   s32;
typedef int64_t   s64;

/**
 * @brief 只读固定宽度整数类型
 */
typedef const u8  uc8;
typedef const u16 uc16;
typedef const u32 uc32;
typedef const u64 uc64;

/**
 * @brief 易失性存储器类型
 */
typedef volatile u8   vu8;
typedef volatile u16  vu16;
typedef volatile u32  vu32;
typedef volatile u64  vu64;

/**
 * @brief 只读易失性存储器类型
 */
typedef volatile const u8  vuc8;
typedef volatile const u16 vuc16;
typedef volatile const u32 vuc32;
typedef volatile const u64 vuc64;

/**
 * @brief 布尔状态枚举
 */
typedef enum {
    STATUS_OK      = 0x00,  ///< 操作成功
    STATUS_ERROR   = 0x01,  ///< 一般错误
    STATUS_BUSY    = 0x02,  ///< 资源忙
    STATUS_TIMEOUT = 0x03,  ///< 操作超时
    STATUS_INVALID = 0x04,  ///< 无效参数
    STATUS_EMPTY   = 0x05,  ///< 空状态
    STATUS_FULL    = 0x06   ///< 满状态
} status_t;

/*======================= 特殊数据结构 =======================*/

/**
 * @brief 字节对 (用于寄存器访问)
 */
typedef union {
    u16 value;          ///< 完整16位值
    struct PACKED_STRUCT {
        u8 low;         ///< 低字节 (LSB)
        u8 high;        ///< 高字节 (MSB)
    } bytes;
} word16_t;

/**
 * @brief 32位数据寄存器
 */
typedef union {
    u32 value;          ///< 完整32位值
    struct PACKED_STRUCT {
        u16 low;        ///< 低16位
        u16 high;       ///< 高16位
    } words;
    struct PACKED_STRUCT {
        u8 byte0;       ///< 字节0 (LSB)
        u8 byte1;
        u8 byte2;
        u8 byte3;       ///< 字节3 (MSB)
    } bytes;
} dword32_t;

/**
 * @brief 通用错误码结构
 */
typedef struct {
    u8 module_id;       ///< 模块标识符
    u8 error_code;      ///< 具体错误码
    u16 line_number;    ///< 错误发生行号
} error_info_t;

/*======================= 类型安全宏 =======================*/

/**
 * @brief 类型安全的内存大小检查
 */
#if 0
#define SIZEOF_TYPE(type, expected) \
    static_assert(sizeof(type) == (expected), "Size mismatch for " #type)

// 编译时大小验证
SIZEOF_TYPE(u8, 1);
SIZEOF_TYPE(u16, 2);
SIZEOF_TYPE(u32, 4);
SIZEOF_TYPE(word16_t, 2);
SIZEOF_TYPE(dword32_t, 4);
#endif
/**
 * @brief 安全类型转换宏
 */
#define CAST(type, expr) ((type)(expr))

#ifdef __cplusplus
}
#endif

#endif /* PROJECT_TYPES_H */

